home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s44play
/
s44p101s.lzh
/
main.s
< prev
next >
Wrap
Text File
|
2000-01-24
|
9KB
|
476 lines
.include doscall.mac
.include iocscall.mac
.include global.mac
;----------------------------------------------------------------
;プログラムの先頭
.text
.align 4,$2048
program_head::
;----------------------------------------------------------------
;実行開始位置
.text
.align 4,$2048
exec_entry:
lea.l (16,a0),a0
suba.l a0,a1
movem.l a0-a1,-(sp)
DOS _SETBLOCK
addq.l #8,sp
lea.l stack_top,sp
pea.l (trap14_routine,pc)
move.w #TRAP14_VECTOR>>2,-(sp)
DOS _INTVCG
move.l d0,trap14_old_vector
DOS _INTVCS
addq.l #6,sp
lea.l (main,pc),a0
moveq.l #-1,d0
bsr takeback
move.l d0,d7
1: tst.b cursor_level
beq 2f
bsr curload
bra 1b
2:
tst.b extra_flag
beq 2f
bsr super
move.w sr,-(sp)
ori.w #$0700,sr
move.l timera_old_vector,d0
beq 1f
move.l d0,TIMERA_VECTOR
clr.l timera_old_vector
bclr.b #5,IMRA ;TIMERA割り込みマスク
bclr.b #5,IERA ;TIMERA割り込み禁止
.if TIMERA_MODE=8
tst.b timera_old_aer
beq @f
bset.b #4,AER ;VDISP信号が0→1(垂直帰線→垂直表示)でカウント
@@:
.endif
move.b timera_old_tacr,TACR
1:
move.l extra_keyin_full_old_vector,d0
beq @f
move.l d0,KEYIN_FULL_VECTOR
clr.l extra_keyin_full_old_vector
@@:
move.w (sp)+,sr
bsr user
2:
bsr free_buffer
tst.b nmi_aborted
beq 1f
bsr silent_ecrlf
move.w #EXIT_NMI,exit_code
lea.l (m_nmi_aborted,pc),a0
bsr eprintcrlf
.if NMI_PC
lea.l (m_nmi_pc,pc),a0
bsr eprint
move.l nmi_pc,d0
bsr h8tos_eprint
bsr ecrlf
.endif
bra 9f
1: tst.b trap14_aborted
beq 1f
bsr silent_ecrlf
move.w #EXIT_TRAP14,exit_code
bsr print_trap14_message
bra 9f
1: tst.b poweroff_aborted
beq 1f
bsr silent_ecrlf
move.w #EXIT_POWEROFF,exit_code
lea.l (m_poweroff_aborted,pc),a0
bsr eprintcrlf
bra 9f
1: tst.b break_aborted
beq 1f
bsr silent_ecrlf
move.w #EXIT_BREAK,exit_code
lea.l (m_break_aborted,pc),a0
bsr eprintcrlf
bra 9f
1: tst.b ctrlc_aborted
beq 1f
bsr silent_ecrlf
move.w #EXIT_CTRLC,exit_code
lea.l (m_ctrlc_aborted,pc),a0
bsr eprintcrlf
bra 9f
1: move.b esc_aborted,d0
beq 1f
bsr silent_ecrlf
move.w #EXIT_ESC,exit_code
lea.l (m_esc_aborted,pc),a0
addq.b #1,d0
beq @f
lea.l (m_q_aborted,pc),a0
@@: bsr silent_eprintcrlf
bra 9f
1:
9:
;SCSI動作中にアボートしたときはSCSIバスリセットを行う
cmpi.w #$00F5,abort_iocs_in_progress
beq @f
tst.b scsicmd_in_progress
beq 1f
@@: lea.l (m_scsi_reset_yesno,pc),a0
bsr eprint
bsr yesno ;本来は標準入力ではなくエラー入力を使うべき
bsr ecrlf
tst.l d0
beq 2f
lea.l (m_scsi_reset_in_progress,pc),a0
bsr eprintcrlf
SCSI _S_RESET
lea.l (m_scsi_reset_done,pc),a0
bsr eprint
bsr inkey ;本来は標準入力ではなくエラー入力を使うべき
bsr ecrlf
bra 2f
1: bsr tini_cdrom ;エラー無視
2:
1: tst.b break_kill_level
beq 2f
bsr break_load
bra 1b
2:
bsr mpu_cache_load
tst.w exit_code
bne @f
tst.b list_flag
bne @f
tst.b conv_flag
bne @f
lea.l (m_done,pc),a0
bsr silent_eprintcrlf
@@:
tst.b extra_flag
beq @f
IOCS _MS_INIT
moveq.l #-1,d1
moveq.l #0,d2
IOCS _SKEY_MOD
@@:
clr.w -(sp)
DOS _KFLUSH
addq.l #2,sp
move.l d7,d0
beq 9f
tst.b trap14_aborted
beq 1f
move.w #EXIT_TRAP14,exit_code
bsr print_trap14_message
1:
9:
move.l trap14_old_vector,d0
beq @f
move.l d0,-(sp)
move.w #TRAP14_VECTOR>>2,-(sp)
DOS _INTVCS
addq.l #6,sp
clr.l trap14_old_vector
@@:
;ファイル出力中にアボートしたときはクローズしてから出力ファイルを削除する
move.w output_fileno,d0
cmp.w #1,d0
ble 1f
move.w d0,-(sp)
DOS _CLOSE
addq.l #2,sp
move.w #-1,output_fileno
move.l output_filename_ptr,d0
beq 1f
move.l d0,-(sp)
DOS _DELETE
addq.l #4,sp
tst.b trap14_aborted
bne @f
lea.l (m_output_aborted,pc),a0
bsr eprintcrlf
@@:
1:
;POWER OFFで終了したときは電源を切る
tst.b poweroff_aborted
beq 9f
bsr super
btst.b #2,GPIPDR ;POWERスイッチ(0=ON,1=OFF)
beq 8f
.if POWEROFF_STANDBY
;POWEROFF_STANDBYで指定された秒数だけ待つ
; この方法では1分以上待つことはできない
lea.l (m_poweroff_standby,pc),a0
bsr eprint
move.w ONTIME_COUNTER,d2 ;次の目標カウンタ
moveq.l #2,d1 ;表示桁数
moveq.l #POWEROFF_STANDBY-1,d4 ;残り秒数
4: sub.w #100,d2
bgt @f
add.w ONTIME_COUNT,d2
@@:
1: btst.b #2,GPIPDR ;POWERスイッチ(0=ON,1=OFF)
beq 7f
move.w ONTIME_COUNTER,d3
sub.w d2,d3
bgt @f
add.w ONTIME_COUNT,d3
@@: add.w d3,d3
cmp.w ONTIME_COUNT,d3
ble 1b
lea.l (m_power_off_time_2,pc),a0
bsr eprint
move.l d4,d0
bsr iusing_eprint
lea.l (m_power_off_time_1,pc),a0
bsr eprint
dbra d4,4b
.endif
move.l #('X68'<<8)+$01,d0
trap #10
7: lea.l (m_poweroff_canceled,pc),a0
bsr eprintcrlf
8: bsr user
9:
move.w exit_code,-(sp)
DOS _EXIT2
m_output_aborted: .dc.b '中止しました',0
.if POWEROFF_STANDBY
m_poweroff_standby:
.dc.b '─────',13,10
.if POWEROFF_STANDBY>=10
.dc.b '0'+POWEROFF_STANDBY/10
.else
.dc.b ' '
.endif
.dc.b '0'+POWEROFF_STANDBY.mod.10
.dc.b ' 秒後に電源を切ります',13,10
.dc.b '電源を切らない場合はフロントスイッチを ON に戻して下さい',13,10
.dc.b '残り '
.if POWEROFF_STANDBY>=10
.dc.b '0'+POWEROFF_STANDBY/10
.else
.dc.b ' '
.endif
.dc.b '0'+POWEROFF_STANDBY.mod.10
m_power_off_time_1:
.dc.b ' 秒',0
m_power_off_time_2:
.dc.b 8,8,8,8,8,0
.endif
m_poweroff_canceled:
.dc.b 13,'─────',13,10
.dc.b '中止しました',0
.even
.data
.even
exit_code:: .dc.w 0
.align 4
trap14_old_vector: .dc.l 0
.bss
.align 4
.ds.b 1024*64
stack_top:
;----------------------------------------------------------------
;メインルーチン
;>d0.l:必ず0を返す
.text
.align 4,$2048
main:
.if TEST_ABSOLUTE=0
lea.l base,a6
.endif
bsr machine_check
bsr mpu_check
bsr mpu_cache_on
.if FORCE_CHANGE_SCSIDRV=0
bsr scsidrv_check
.endif
lea.l (1,a2),a0
bsr get_params
bmi exit
bsr silent_print_banner
tst.b extra_flag
beq 2f
bsr timera_check
beq 2f
bsr eaprintcrlf
bra exit
2:
bsr timerd_check
beq 2f ;TIMER-D割り込みは未使用
tst.b tdpause_flag
beq 1f ;-tdpauseでないのでエラー
cmp.l #-2,d0
beq 2f ;-tdpauseでHumanが使用中なので使用可能
1: bsr eaprintcrlf
bra exit
2:
bsr malloc_buffer
bmi exit
bsr make_table
bsr init_data
bmi exit
tst.b extra_flag
bne 1f
lea.l (m_start_message1,pc),a0
bsr silent_eprintcrlf
lea.l (m_start_message2,pc),a0
bsr silent_eprintcrlf
bra 2f
1: lea.l (m_start_message3,pc),a0
bsr silent_eprintcrlf
lea.l (m_start_message4,pc),a0
bsr silent_eprintcrlf
2:
tst.b extra_flag
beq 2f
bsr super
move.w sr,-(sp)
ori.w #$0700,sr
move.b TACR,timera_old_tacr
move.b #$00,TACR ;TIMERAカウント禁止
.if TIMERA_MODE=8
bclr.b #4,AER ;VDISP信号が1→0(垂直表示→垂直帰線)でカウント
sne.b timera_old_aer
.endif
bset.b #5,IERA ;TIMERA割り込み許可
bset.b #5,IMRA ;TIMERA割り込みマスク解除
move.l TIMERA_VECTOR,timera_old_vector
move.l #timera_routine,TIMERA_VECTOR
move.b #TIMERA_COUNT.and.255,TADR ;TIMERAカウンタ設定
move.b #TIMERA_MODE,TACR ;TIMERAカウント開始
move.l KEYIN_FULL_VECTOR,extra_keyin_full_old_vector
move.l #extra_keyin_full_routine,KEYIN_FULL_VECTOR
move.w (sp)+,sr
bsr user
2:
tst.b extra_flag
beq @f
IOCS _MS_CUROF
moveq.l #0,d1
moveq.l #0,d2
IOCS _SKEY_MOD
@@:
bsr curhide
core_loop_loop:
lea.l param_buf,a2
tst.l (pb_ptr,a2)
bmi exit
core_loop:
move.l a2,current_param_ptr
bsr core_entry
bmi exit
tst.w exit_code
bne exit
movea.l next_param_ptr,a2
tst.l (pb_ptr,a2)
bpl core_loop
tst.b loop_flag
bne core_loop_loop
exit:
moveq.l #0,d0
rts
m_start_message1: .dc.b '[ESC]/[Q] で終了、[CTRL+C]/[BREAK]/[INTERRUPT]/POWER OFF で強制終了できます',0
m_start_message2: .dc.b '[TAB] でスキップ、[F] でフェードアウトできます',0
m_start_message3:
.if TEST_ESC
.dc.b '[ESC] で終了、'
.endif
.if TEST_BREAK
.dc.b '[BREAK]/'
.endif
.dc.b '[INTERRUPT]/POWER OFF で強制終了できます',0
m_start_message4: .dc.b 'キー/パッド/マウスのボタン操作でフェードアウト、終了できます',0
m_nmi_aborted: .dc.b '[INTERRUPT] で強制終了しました',0
m_poweroff_aborted: .dc.b 'POWER OFF で強制終了しました',0
m_break_aborted: .dc.b '[BREAK] で強制終了しました',0
m_ctrlc_aborted: .dc.b '[CTRL+C] で強制終了しました',0
m_esc_aborted: .dc.b '[ESC] で終了しました',0
m_q_aborted: .dc.b '[Q] で終了しました',0
.if NMI_PC
m_nmi_pc: .dc.b ' PC=$',0
.endif
m_scsi_reset_yesno: .dc.b 'SCSI コマンドを中断してしまったようです。'
.dc.b 'SCSI バスリセットを行いますか (y/n)? ',0
m_scsi_reset_in_progress: .dc.b 'SCSI バスリセット実行中です',13,10
.dc.b 'すべての SCSI 装置のアクセスランプが消えるまで、何も操作しないで下さい',0
m_scsi_reset_done: .dc.b 'すべての SCSI 装置のアクセスランプが消えるまで待ってから、何かキーを押して下さい',0
m_done: .dc.b '正常終了しました',0
.even
.data
.align 4
extra_keyin_full_old_vector: .dc.l 0
timera_old_vector: .dc.l 0
timera_old_ierb: .dc.b 0
timera_old_imrb: .dc.b 0
timera_old_tacr: .dc.b $08
.if TIMERA_MODE=8
timera_old_aer: .dc.b $08
.endif
;----------------------------------------------------------------
.end exec_entry